package uy.edu.ort.negocio;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import javax.ejb.EJB;
import javax.ejb.Singleton;
import org.apache.log4j.Logger;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import uy.edu.ort.dominio.Consulta;
import uy.edu.ort.dominio.RespuestaConsulta;
import uy.edu.ort.dp.dominio.Fuente;
import uy.edu.ort.dp.interfaces.FuenteSBRemote;

/**
 *
 * @author 153287-154559
 */
@Singleton
public class ProcesarConsultaSB implements ProcesarConsultaSBLocal {

    static Logger logger = Logger.getLogger(ProcesarConsultaSB.class);

      @EJB
    FuenteSBRemote ejbFuente;
      
    @Override
    public String procesarConsulta(String consulta) {
        Consulta jConsulta;
        ObjectMapper mapper = new ObjectMapper();
        String ret;
        String error_message = "Error interno.";
        try {
            jConsulta = mapper.readValue(consulta, Consulta.class);
            if (!validarFuente(jConsulta.getFuente(), jConsulta.getCodigoAutorizacion())) {
                ret = "Fuente id o código de autorización no validos.";
            } else {
                ret = procesarRespuesta();
            }
        } catch (FileNotFoundException ex) {
            logger.error("No se encontró el archivo: " + ex.getMessage());
            ret = error_message;
        } catch (JsonParseException ex) {
            logger.error("Format incorrecto de Consulta: " + ex.getMessage());
            ret = "Formato de la Consulta incorrecto.";
        } catch (JsonGenerationException ex) {
            logger.error("Error al generar la respuesta: " + ex.getMessage());
            ret = error_message;
        } catch (JsonMappingException ex) {
            logger.error("No se puede mapear la entrada: " + ex.getMessage());
            ret = "Uno o más datos de la Consulta son incorrectos.";
        } catch (IOException ex) {
            logger.error("Error desconocido: " + ex.getMessage());
            ret = error_message;
        }
        return ret;
    }

    private String procesarRespuesta() throws FileNotFoundException, JsonGenerationException, IOException {

        String ret;
        BufferedReader br = new BufferedReader(new FileReader("c:/agencia noticias/Topicos.txt"));
        RespuestaConsulta res = new RespuestaConsulta();

        String line = br.readLine();

        if (line == null || line.trim().isEmpty()) {
            ret = "No hay tópicos disponibles.";
        } else {
            String[] topicos = line.split(",");
            Collection<String> listaRet = new ArrayList<String>();
            listaRet.addAll(Arrays.asList(topicos));
            res.setLista(listaRet);
            ObjectMapper mapper = new ObjectMapper();
            ret = mapper.writeValueAsString(res);
        }
        
        return ret;
    }

    private boolean validarFuente(Long idFuente, String codigoAutorizacion) throws FileNotFoundException,
            NumberFormatException, IOException {        
        boolean ret = true;

        Fuente dbFuente = ejbFuente.obtenerFuentePorId(idFuente);

        //No existe fuente
        if (dbFuente == null) {
            return false;
        } else if (!dbFuente.getCod_autorizacion().equals(codigoAutorizacion)) {
            return false;
        }

        return ret;
    }

}
